package com.feicheng.iou.oss;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.IdUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.PutObjectResult;
import com.feicheng.iou.oss.util.ConstantOSSPropertiesUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.InputStream;

/**
 * @Author tianchunlei
 * @Des //oss业务类，实现文件上传
 * @Date 2021/8/17
 **/
@Service
@Slf4j
public class OssService {

    /**
     * @return 返回上传至阿里云后文件所在的http地址
     * @Author tianchunlei
     * @Description //文件上传方法
     * @Date 2021/8/17 22:11
     * @Param inputStream 节点流对象
     * module用来做业务分类，不同的业务上传至不同文件目录，需要前端传递
     * fileName 用户上传的文件名字，但是方法内对文件名会做特殊处理
     */
    public String upload(InputStream inputStream, String module, String fileName) {

        log.info("OssService的upload方法进入,参数为: inputStream= " + inputStream + ",module= " + module + ",fileName= " + fileName);

        //创建oss对象实例
        OSS ossClient = new OSSClientBuilder().build(
                ConstantOSSPropertiesUtils.END_POINT,
                ConstantOSSPropertiesUtils.ACCESS_KEY_ID,
                ConstantOSSPropertiesUtils.SECRET);

        //判断bucket是否存在，不存在则创建bucket
        if (!ossClient.doesBucketExist(ConstantOSSPropertiesUtils.BUCEKT_NAME)) {
            ossClient.createBucket(ConstantOSSPropertiesUtils.BUCEKT_NAME);
            ossClient.setBucketAcl(ConstantOSSPropertiesUtils.BUCEKT_NAME, CannedAccessControlList.PublicRead);
        }

        //构建日期路径
        String timeFolder = new DateTime().toString("/yyyy/MM/dd/");
        //构建整体目录
        /*
        整体目录由以下几个部分构成
        module：前端传递的要上传的业务类型，比如 身份证  线索记录  头像 等
        timeFolder：想做成每天都生成一个按照日期生成的文件夹
        fileName：文件名由随机字符+原始文件名构成
        例如：/idcard/2021/08/17/abcdefghijklmnfront.jpg
         */
        String key = module + timeFolder + IdUtil.simpleUUID() + fileName;

        //文件上传操作
        ossClient.putObject(ConstantOSSPropertiesUtils.BUCEKT_NAME, key, inputStream);

        //关闭连接操作
        ossClient.shutdown();
        //https://stackcoding.oss-cn-beijing.aliyuncs.com/idcard/2021/08/17/hand.jpeg
        //最终返回的文件的地址应为 https://stackcoding.oss-cn-beijing.aliyuncs.com/idcard/front.jpeg
        //构建最终返回的目录
        String url = "https://" + ConstantOSSPropertiesUtils.BUCEKT_NAME + "." + ConstantOSSPropertiesUtils.END_POINT + "/" + key;

        log.info("上传后返回的url为: " + url);
        return  url;
    }


}
